/**
 * Redis配置文件
 * 包含连接参数和配置选项
 */

// 编译时环境检测
const isProductionBuild = process.env.NODE_ENV === 'production' || process.env.BUILD_ENV === 'production';

// 根据编译时环境选择配置
const getRedisConfig = () => {
    if (isProductionBuild) {
        return {
            host: '127.0.0.1',
            port: 6379,
            password: '',
            db: 0,
        };
    } else {
        return {
            host: '43.143.253.188',
            port: 6379,
            password: 'jack666',
            db: 0,
        };
    }
};

const redisConfig = getRedisConfig();

module.exports = {
    // 连接配置
    connection: {
        host: process.env.REDIS_HOST || redisConfig.host,
        port: parseInt(process.env.REDIS_PORT) || redisConfig.port,
        password: process.env.REDIS_PASSWORD || redisConfig.password,
        db: parseInt(process.env.REDIS_DB) || redisConfig.db,
    },

    // 连接选项
    options: {
        connectTimeout: 10000,      // 连接超时时间 (毫秒)
        commandTimeout: 5000,       // 命令超时时间 (毫秒)
        retryDelayOnFailover: 100,  // 故障转移重试延迟 (毫秒)
        maxRetriesPerRequest: 3,    // 每个请求最大重试次数
        lazyConnect: false,         // 是否延迟连接
        keepAlive: 30000,           // 保持连接时间 (毫秒)
    },

    // 集群配置 (如果需要)
    cluster: {
        enabled: false,
        nodes: [
            // { host: '43.143.253.188', port: 6379 },
            // { host: '43.143.253.189', port: 6379 },
        ],
    },

    // 哨兵配置 (如果需要)
    sentinel: {
        enabled: false,
        sentinels: [
            // { host: '43.143.253.188', port: 26379 },
            // { host: '43.143.253.189', port: 26379 },
        ],
        name: 'mymaster',
    },

    // 连接池配置
    pool: {
        min: 2,                     // 最小连接数
        max: 10,                    // 最大连接数
        acquireTimeoutMillis: 30000, // 获取连接超时时间
        createTimeoutMillis: 30000,  // 创建连接超时时间
        destroyTimeoutMillis: 5000,  // 销毁连接超时时间
        idleTimeoutMillis: 30000,    // 空闲连接超时时间
        reapIntervalMillis: 1000,    // 清理间隔时间
        createRetryIntervalMillis: 200, // 创建重试间隔时间
    },

    // 缓存配置
    cache: {
        defaultTTL: 3600,           // 默认过期时间 (秒)
        prefix: 'nestjs:',          // 键前缀
        maxMemoryPolicy: 'allkeys-lru', // 内存策略
    },

    // 监控配置
    monitoring: {
        enabled: true,               // 是否启用监控
        slowQueryThreshold: 100,    // 慢查询阈值 (毫秒)
        logSlowQueries: true,       // 是否记录慢查询
        metricsInterval: 60000,     // 指标收集间隔 (毫秒)
    },

    // 安全配置
    security: {
        enableTLS: false,           // 是否启用TLS
        caCert: null,               // CA证书路径
        clientCert: null,           // 客户端证书路径
        clientKey: null,            // 客户端私钥路径
        rejectUnauthorized: true,   // 是否拒绝未授权连接
    },

    // 日志配置
    logging: {
        level: 'info',               // 日志级别
        enableCommands: true,       // 是否记录命令
        enableErrors: true,         // 是否记录错误
        enableWarnings: true,       // 是否记录警告
    },

    // 健康检查配置
    healthCheck: {
        enabled: true,               // 是否启用健康检查
        interval: 30000,            // 检查间隔 (毫秒)
        timeout: 5000,              // 检查超时时间 (毫秒)
        retries: 3,                 // 重试次数
    },

    // 获取完整配置
    getFullConfig () {
        return {
            ...this.connection,
            ...this.options,
        };
    },

    // 获取连接字符串
    getConnectionString () {
        const { host, port, password, db } = this.connection;
        if (password) {
            return `redis://:${password}@${host}:${port}/${db}`;
        }
        return `redis://${host}:${port}/${db}`;
    },

    // 验证配置
    validate () {
        const { host, port, password } = this.connection;

        if (!host || typeof host !== 'string') {
            throw new Error('Redis host must be a valid string');
        }

        if (!port || port < 1 || port > 65535) {
            throw new Error('Redis port must be between 1 and 65535');
        }

        if (password && typeof password !== 'string') {
            throw new Error('Redis password must be a valid string');
        }

        return true;
    },

    // 打印配置信息
    printConfig () {
        console.log('🔧 Redis配置信息:');
        console.log(`   主机: ${this.connection.host}`);
        console.log(`   端口: ${this.connection.port}`);
        console.log(`   数据库: ${this.connection.db}`);
        console.log(`   密码: ${this.connection.password ? '***' : '无'}`);
        console.log(`   连接字符串: ${this.getConnectionString()}`);
        console.log('');
    }
}; 